package com.cardone.platform.usercenter.service;

import java.util.List;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;

import com.cardone.common.cache.Caches;
import com.cardone.common.dto.PaginationDto;
import com.cardone.platform.usercenter.dto.UserDto;

/**
 * 用户服务
 *
 * @author yaohaitao
 */
public interface UserService {
	/**
	 * spring bean id
	 */
	String BEAN_ID = "com.cardone.platform.usercenter.service.UserService";

	/**
	 * 保存:用户
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param saveUser
	 *          用户对象
	 *
	 * @return 用户对象
	 */
	@Deprecated
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	<P> P saveByIdOrCode(final Class<P> mappedClass, final UserDto saveUser);

	/**
	 * 保存:用户
	 *
	 * @param saveUser
	 *          用户对象
	 *
	 * @return 用户对象
	 */
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	UserDto saveByCode(final UserDto saveUser);

	/**
	 * 登录
	 *
	 * @param loginUser
	 *          登录信息
	 * @return 登录结果
	 */
	UserDto login(final UserDto loginUser);

	/**
	 * 注册
	 *
	 * @param registerUser
	 *          注册信息
	 * @return 注册结果
	 */
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	UserDto register(final UserDto registerUser);

	/**
	 * 插入
	 *
	 * @param insertUser
	 *          用户对象
	 *
	 * @return 影响行数
	 */
	@Deprecated
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int insertByCode(final UserDto insertUser);

	/**
	 * 删除
	 *
	 * @param deleteUser
	 *          用户对象
	 *
	 * @return 影响行数
	 */
	@Deprecated
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int deleteByIds(final UserDto deleteUser);

	/**
	 * 更新
	 *
	 * @param updateUser
	 *          用户对象
	 *
	 * @return 影响行数
	 */
	@Deprecated
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int updateByCode(final UserDto updateUser);

	/**
	 * 更新
	 *
	 * @param id
	 *          标识
	 * @return 影响行数
	 */
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int updateEndDateByIdForInvalid(final String id);

	/**
	 * 查询
	 *
	 * @return 返回数据
	 */
	@Cacheable(value = UserService.BEAN_ID, key = Caches.KEY_1)
	Integer readByCodeNqIdForCount(final UserDto readUser);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findUser
	 *          用户对象
	 * @return 返回对象
	 */
	@Cacheable(value = UserService.BEAN_ID, key = Caches.KEY_2)
	<P> P findById(final Class<P> mappedClass, final UserDto findUser);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findUser
	 *          用户对象
	 * @return 返回对象
	 */
	@Cacheable(value = UserService.BEAN_ID, key = Caches.KEY_1)
	UserDto findById(final UserDto findUser);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param id
	 *          标识
	 * @return 返回对象
	 */
	@Cacheable(value = UserService.BEAN_ID, key = Caches.KEY_1)
	UserDto findById(final String id);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findUser
	 *          用户对象
	 *
	 * @return 返回对象
	 */
	@Cacheable(value = UserService.BEAN_ID, key = Caches.KEY_2)
	<P> P findByCodeForLogin(final Class<P> mappedClass, final UserDto findUser);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findUser
	 *          用户对象
	 *
	 * @return 返回对象
	 */
	@Cacheable(value = UserService.BEAN_ID, key = Caches.KEY_2)
	<P> P findByCodeOrId(final Class<P> mappedClass, final UserDto findUser);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findListUser
	 *          用户对象
	 *
	 * @return 用户对象集合
	 */
	@Deprecated
	@Cacheable(value = UserService.BEAN_ID, key = Caches.KEY_2)
	<P> List<P> findListByLikeCode(final Class<P> mappedClass, final UserDto findListUser);

	/**
	 * 分页
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param paginationUser
	 *          用户对象
	 *
	 * @return 用户分页对象
	 */
	<P> PaginationDto<P> paginationByLikeCode(final Class<P> mappedClass, final UserDto paginationUser);

	/**
	 * 分页
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param paginationUser
	 *          用户对象
	 *
	 * @return 用户分页对象
	 */
	<P> PaginationDto<P> paginationByOrgIdAndLikeCode(final Class<P> mappedClass, final UserDto paginationUser);

	/**
	 * 更新
	 *
	 * @param id
	 *          用户标识
	 * @param newPassword
	 *          密码
	 * @return 影响行数
	 */
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int updatePasswordById(final String id, final String newPassword);

	/**
	 * 更新
	 *
	 * @param id
	 *          用户标识
	 * @param newPassword
	 *          密码
	 * @param isDiges
	 *          是否加密
	 * @return 影响行数
	 */
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int updatePasswordById(final String id, final String oldPassword, final String newPassword);

	/**
	 * 更新
	 *
	 * @param id
	 *          用户标识
	 * @param newPassword
	 *          密码
	 * @param isDiges
	 *          是否加密
	 * @return 影响行数
	 */
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int updatePasswordById(final String id, final String oldPassword, final String newPassword, final Boolean isDiges);

	/**
	 * 更新
	 *
	 * @param updateUser
	 *          用户对象
	 * @param updateMobilePhone
	 *          更新手机号码
	 * @return 影响行数
	 */
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int updateForBaseInfo(final UserDto updateUser, final Boolean updateMobilePhone);

	/**
	 * 更新
	 *
	 * @param updateUser
	 *          用户对象
	 * @param updateMobilePhone
	 *          更新手机号码
	 * @return 影响行数
	 */
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int updateForFullInfo(final UserDto updateUser, final Boolean updateMobilePhone);

	/**
	 * 更新
	 *
	 * @param updateUser
	 *          用户对象
	 * @return 影响行数
	 */
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int updateForDetail(final UserDto updateUser);

	/**
	 * 更新手机号码
	 *
	 * @param id
	 *          标识
	 * @param mobilePhone
	 *          手机号码
	 * @return 影响行数
	 */
	@CacheEvict(value = UserService.BEAN_ID, allEntries = true)
	int updateMobilePhone(final String id, final String mobilePhone);
}